home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / SWAG / SWAGA_C / COMM.SWG / 0059_Example Intr($14.pas < prev    next >
Pascal/Delphi Source File  |  1994-08-25  |  3KB  |  89 lines

  1. {
  2. >Hi Greg;  I tried this out a few minutes ago but it insists on
  3. >accessing COM1.
  4.  
  5.  Sorry about that. I should have used a single global CONSTant for
  6.  the COM port number. I made the change, so now you just need to
  7.  have "COMx = 2" for COM2.
  8.  
  9.  This code is a quick'n-dirty example, so I'm certain that there
  10.  are errors/bugs in the COM i/o error checking. I'll take another
  11.  look at it later...
  12. }
  13.  
  14. PROGRAM UseInt14;
  15. USES  Dos, Crt;
  16.  
  17. CONST COMx = 1;               { <<-- 1 for COM1, 2 for COM2, etc.   }
  18.  
  19. VAR   reg   : Registers;      { CPU registers                       }
  20.       Okay  : BOOLEAN;
  21.       ch    : CHAR;           { i/o character                       }
  22.  
  23. PROCEDURE InitCOM (PortNo,Baud,WordLen,Parity,Stops:WORD);
  24.   VAR IniParm:BYTE; BEGIN
  25.     IniParm := 0;
  26.     CASE Baud OF
  27.       300   : IniParm := 64;
  28.       1200  : IniParm := 128;
  29.       2400  : IniParm := 160;
  30.       4800  : IniParm := 192;
  31.       9600  : IniParm := 224;
  32.     END{CASE};
  33.     CASE Parity OF
  34.       1   : {odd}   IniParm := IniParm OR 8;
  35.       2   : {none}  ;
  36.       3   : {even}  IniParm := IniParm OR 24;
  37.     END{CASE};
  38.     CASE Stops OF
  39.       2   : IniParm := IniParm OR 4;
  40.     ELSE  ;
  41.     END{CASE};
  42.     CASE WordLen OF
  43.       7 : IniParm := IniParm OR 2;
  44.       8 : IniParm := IniParm OR 3;
  45.     END{CASE};
  46.     reg.DX := PortNo - 1;; reg.AL := IniParm;;
  47.     reg.AH := 0;; Intr($14,reg);
  48.   END {InitCOM};
  49.  
  50. PROCEDURE PutComChar (PortNo:WORD; Data:CHAR); BEGIN
  51.     reg.DX := PortNo - 1;; reg.AL := ORD(Data);;
  52.     reg.AH := 1;; Intr($14,reg);
  53.     Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
  54.   END {PutComChar};
  55.  
  56. PROCEDURE GetComChar (PortNo:WORD; VAR Data:CHAR); BEGIN
  57.     reg.DX := PortNo - 1;; reg.AH := 2;; Intr($14,reg);;
  58.     Data := CHR(reg.AL);
  59.     Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
  60.   END {GetComChar};
  61.  
  62. FUNCTION ComReady (PortNo:WORD):BOOLEAN; BEGIN
  63.     reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
  64.     Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
  65.     ComReady := (reg.AH AND 96) <> 0;
  66.   END {ComReady};
  67.  
  68. FUNCTION ComDataAvailable (PortNo:WORD):BOOLEAN; BEGIN
  69.     reg.AH := 3;; reg.DX := PortNo - 1;; Intr($14,reg);
  70.     Okay := ((reg.AL AND 14) = 0) OR NOT BOOLEAN(reg.AH SHR 7);
  71.     ComDataAvailable := (reg.AH AND 1) <> 0;
  72.   END {ComDataAvailable};
  73.  
  74. BEGIN {UseInt14}
  75.   InitCOM (COMx,9600,8,2,1);    { initialize COMx: 9600 bps, 8n1  }
  76.   REPEAT
  77.     IF ComDataAvailable(COMx) THEN GetComChar(COMx,ch) ELSE ch := #0;
  78.     IF (ch <> #0) THEN Write (ch);
  79.     IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
  80.     IF KeyPressed THEN ch := ReadKey ELSE ch := #0;
  81.     IF (ch <> #0) THEN BEGIN
  82.       REPEAT {wait} UNTIL ComReady(COMx);
  83.       PutComChar(COMx,ch);
  84.     END{IF};
  85.     IF NOT Okay THEN WriteLn(#13,#10,'****COM I/O ERROR****',#7);
  86.   UNTIL ch = #27;   { exit when ESC key pressed }
  87.  
  88. END {UseInt14}.
  89.